#include <iostream>

class Base
{
public:
    Base()
    {
        std::cout<<"父类构造！\n";
        a = new int;
    }
    virtual ~Base() // 虚析构函数
    {
        std::cout<<"父类析构！\n";
        delete a;
    }
private:
    int *a;
};

class Derived:public Base
{
public:
    Derived():Base()
    {
        std::cout<<"子类构造！\n";
        b = new int;
    }
    ~Derived()
    {
        std::cout<<"子类析构！\n";
        delete b;
    }
private:
    int *b;
};

int main()
{
    // Derived *d = new Derived; // 这样写没有内存泄漏
    
    // new的时候是子类对象，所以父类构造和子类构造没问题
    Base *d = new Derived; 
    // 但delete的时候，由于是父类指针，所以没有办法调子类析构
    delete d;
    // 多态里存在的一大问题：
    // 父类指针指向子类对象，也就是向上转型的过程中，delete释放基类指针，不会调子类的虚构函数，会造成子类对象的内存泄漏
    // 所以要把基类对象声明为虚函数
    return 0;
}